/**
 * Package:com.goldcitynet.server.data;
 * $Id$
 * Copyright(c) 2001-2005 www.afteryuan.com
 */
package com.afteryuan.server.data;

import com.afteryuan.server.data.Sprite;
import com.afteryuan.server.data.Room;

import java.util.Collection;

/**
 * 精灵数据池接口
 * 精灵数据池接口定义了业务逻辑和数据之间的交互方式.业务逻辑层通过此接口存取精灵数据
 * <p/>
 * <p><a href="DataPool.java.html"><i>View Source</i></a></p>
 *
 * @author <a href="mailto:afteryuan@afteryuan.com">$Author$</a>
 * @version $Revision$
 */
public interface SpritePool {
    /**
     * 将Sprite保存到服务器的在线精灵列表
     *
     * @param sprite 要保存的sprite
     */
    void addToServer(Sprite sprite);

    /**
     * 将Sprite加入到Ghost列表,即游离对象列表
     *
     * @param sprite 要保存的sprite
     */
    void addToGhost(Sprite sprite);

    /**
     * 将Sprite保存到某个Room
     *
     * @param sprite 要保存的sprite
     */
    void addToRoom(Sprite sprite);

    /**
     * 将Sprite保存到正在移动队列
     *
     * @param sprite 要保存的sprite
     */
    void addToMoving(Sprite sprite);

    /**
     * 从Room中删除 sprite
     * @param spriteId
     */
    void removeFromMoving(String spriteId);
    /**
     * 从Room中删除 sprite
     * @param room
     * @param spriteId
     */
    void removeFromRoom(Room room,String spriteId);

    /**
     * 从服务器在线列表中删除
     * @param spriteId
     */
    void removeFromServer(String spriteId);

    /**
     * 从游离对象列表中删除
     * @param spriteId
     */
    void removeFromGhost(String spriteId);
    /**
     * 取得缓存内的Sprite
     * 方法是直接到在线精灵列表中搜索
     *
     * @param spriteId id
     * @return Sprite 如果没有则返回null
     */
    Sprite get(String spriteId);

    /**
     * 取得缓存内的Sprite
     * 如果能获得房间的信息,尽量用此方法,以获得更好的性能
     * 此方法是通过场景房间层次关系,先找到所在房间,再找到Sprite
     *
     * @param room     所在的房间
     * @param spriteId id
     * @return Sprite 如果没有则返回null
     */
    Sprite get(Room room, String spriteId);

    /**
     * 取得一个场景的所有Sprite
     *
     * @param sceneId 场景ID
     * @return Collection<Sprite>
     */
    Collection<Sprite> listOfSecne(String sceneId);

    /**
     * 取得一个场景实例的所有Sprite
     *
     * @param room 实例ID
     * @return Collection<Sprite>
     */
    Collection<Sprite> listOfRoom(Room room);
    /**
     * 取得一个场景实例的所有Sprite
     *
     * @return Collection<Sprite>
     */
    Collection<Sprite> listOfMoving();

    /**
     * 取得所有Sprite
     *
     * @return Collection<Sprite>
     */
    Collection<Sprite> listAll();

    /**
     * 用户是否存在于指定的空间
     * @param room
     * @return true if exist!
     */
    Boolean isExist(Room room, String spriteId);

}
